#ifndef _GPIO_H_
#define _GPIO_H_

#include "soc.h"

typedef enum {
	GPIO_PORT_A = 0,
	GPIO_PORT_B = 1,
	GPIO_PORT_C = 2,
	GPIO_PORT_D = 3,
	GPIO_PORT_E = 4,
	GPIO_PORT_F = 5,
	GPIO_PORT_H = 6,
	GPIO_PORT_G = 7,
	GPIO_PORT_I = 8,
} GPIO_PortEnum;

typedef enum { 
	GPIO_PIN_0  = 0, 
	GPIO_PIN_1  = 1,
	GPIO_PIN_2  = 2,
	GPIO_PIN_3  = 3,
	GPIO_PIN_4  = 4,
	GPIO_PIN_5  = 5,
	GPIO_PIN_6  = 6,
	GPIO_PIN_7  = 7,
	GPIO_PIN_8  = 8,
	GPIO_PIN_9  = 9,
	GPIO_PIN_10 = 10,
	GPIO_PIN_11 = 11,
	GPIO_PIN_12 = 12,
	GPIO_PIN_13 = 13,
	GPIO_PIN_14 = 14,
	GPIO_PIN_15 = 15,
} GPIO_PinEnum;

typedef enum {
	GPIO_MODE_IN     = 0,
	GPIO_MODE_OUT    = 1,
	GPIO_MODE_AF     = 2,
	GPIO_MODE_ANALOG = 3,
} GPIO_ModeEnum;

typedef enum {
	GPIO_OTYPE_PP = 0,
	GPIO_OTYPE_OD = 1,
} GPIO_OTypeEnum;

typedef enum {
	GPIO_OSPEED_2M   = 0,
	GPIO_OSPEED_25M  = 1,
	GPIO_OSPEED_50M  = 2,
	GPIO_OSPEED_100M = 3,  /* 30pF时为100MHz，15pF时为80MHz */
} GPIO_OSpeedEnum;

typedef enum {
	GPIO_PUPD_NONE = 0,
	GPIO_PUPD_UP   = 1,
	GPIO_PUPD_DOWN = 2,
} GPIO_PuPdEnum;

typedef enum { 
	GPIO_AF_0  = 0, 
	GPIO_AF_1  = 1,
	GPIO_AF_2  = 2,
	GPIO_AF_3  = 3,
	GPIO_AF_4  = 4,
	GPIO_AF_5  = 5,
	GPIO_AF_6  = 6,
	GPIO_AF_7  = 7,
	GPIO_AF_8  = 8,
	GPIO_AF_9  = 9,
	GPIO_AF_10 = 10,
	GPIO_AF_11 = 11,
	GPIO_AF_12 = 12,
	GPIO_AF_13 = 13,
	GPIO_AF_14 = 14,
	GPIO_AF_15 = 15,
} GPIO_AfEnum;

typedef struct {
	GPIO_PortEnum port;
	GPIO_PinEnum pin;
	GPIO_ModeEnum mode;
	GPIO_OTypeEnum otype;
	GPIO_OSpeedEnum ospeed;
	GPIO_PuPdEnum pupd;
	GPIO_AfEnum af;
} GPIO_InitStruct;

void GPIO_Init(const GPIO_InitStruct *gpioInit);

#endif /* _GPIO_H_ */
